package model.core.torneo;

import model.core.document.AbstractDocumentable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import model.core.utente.GiocatoreInterface;
import model.core.utente.Studente;
import model.utility.Constants;
import model.utility.Utility;

/**
 * 
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class Gara extends AbstractDocumentable implements StatoGara{

	private ArrayList<GiocatoreInterface> giocatori;

	private int nro_giorni_da_disputare;

	private GregorianCalendar data_inizio;

	private GregorianCalendar data_fine;

	private boolean isSync;

	private String stato;

	private GiocatoreInterface vincitore;
	
	private Studente arbitro;

	public Gara(){
		nro_giorni_da_disputare = Constants.min_giorni_completamento_gara;
		data_inizio = new GregorianCalendar();
		data_fine = new GregorianCalendar();
		data_fine.roll(Calendar.DAY_OF_MONTH, true);
		stato = SCHEDULATA;
		giocatori = new ArrayList<GiocatoreInterface>();
	}
	
	/**
	 * @return the arbitro
	 */
	public Studente getArbitro() {
		return arbitro;
	}
	
	/**
	 * @param arbitro the arbitro to set
	 */
	public void setArbitro(Studente arbitro) {
		this.arbitro = arbitro;
	}
	
	public GiocatoreInterface getVincitore() {
		return vincitore;
	}

	public boolean setVincitore(GiocatoreInterface vincitore) {
		if(Utility.isThereGiocatore(giocatori, vincitore))
				{
			this.vincitore = vincitore;
			return true;
				}
		else
			return false;
	}

	public boolean addGiocatore(GiocatoreInterface giocatore){
		if(Utility.isThereGiocatore(giocatori, giocatore))
				return false;
		else
			return giocatori.add(giocatore);
	}
	
	public boolean removeGiocatore(GiocatoreInterface giocatore){
		if(Utility.isThereGiocatore(giocatori, giocatore))
				return giocatori.remove(giocatore);
		else
			return false;
	}
	
	public ArrayList<GiocatoreInterface> getGiocatori() {
		return giocatori;
	}

	public void setGiocatori(ArrayList<GiocatoreInterface> giocatori) {
		this.giocatori = giocatori;
	}

	public int getNro_giorni_da_disputare() {
		return nro_giorni_da_disputare;
	}

	public boolean setNro_giorni_da_disputare(int nro_giorni_da_disputare) {
		if(nro_giorni_da_disputare<=Constants.max_giorni_completamento_gara
				&& nro_giorni_da_disputare>=Constants.min_giorni_completamento_gara){
			this.nro_giorni_da_disputare = nro_giorni_da_disputare;
			return true;
		}
		else
			return false;
	}

	public GregorianCalendar getData_inizio() {
		return data_inizio;
	}

	public void setData_inizio(GregorianCalendar data_inizio) {
		this.data_inizio = data_inizio;
	}

	public GregorianCalendar getData_fine() {
		return data_fine;
	}

	public void setData_fine(GregorianCalendar data_fine) {
		this.data_fine = data_fine;
	}

	public boolean isSync() {
		return isSync;
	}

	public void setSync(boolean isSync) {
		this.isSync = isSync;
	}

	public String getStato() {
		return stato;
	}

	/**
	 * 
	 * @param stato
	 * @throws IllegalStateException
	 */
	public boolean setStato(String stato) {
		if(this.stato.equals(stato))
			return true;
		else if(stato.equals(SCHEDULATA))
			return false;
		else{
			switch (this.stato) {
			case TERMINATA:
				return false;
			default:
				this.stato=stato;
				return true;
			}
		}
	}

}
